package controller;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;
import model.ArtikelFilm;
import model.Datadrager;
import model.Genre;
import model.Klant;
import model.Reservering;
import model.Uitvoering;
import org.joda.time.DateTime;
import org.joda.time.Days;

/**
 *
 *
 * @author Eric & Maurice
 */
public final class DatabaseControllerKlant {

    private Properties props = new Properties();
    private String drivers = null;
    private String url = null;
    private String username = null;
    private String password = null;
    private Connection cxn;
    private int generatedKlantID = -1;
    private int generatedVestigingID = -1;

    /**
     * Constructor, properties worden ingelezen uit het opgegeven properties
     * bestand.
     */
    public DatabaseControllerKlant() {
        FileInputStream in = null;
        try {
            in = new FileInputStream("dbklant.prop");
            props.load(in);
            in.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                in.close();
            } catch (IOException ex) {
                Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        loadProperties();
    }

    /**
     * Haalt de configuratie gegevens tbv de database verbinding uit het
     * ingelezen properties bestand.
     */
    private void loadProperties() {
        this.drivers = props.getProperty("driver");
        this.url = props.getProperty("url");
        this.username = props.getProperty("username");
        this.password = props.getProperty("password");
    }

    /**
     * Creert de database verbinding. Als er geen bestaande verbinding is wordt
     * deze gemaakt.
     *
     * @return De actieve database verbinding (connection object) of null.
     * @throws SQLException als er een Exceptie plaats vind.
     */
    private Connection getConnection() throws SQLException {
        if (this.cxn == null) {
            try {
                //Connection con;
                Class.forName(this.drivers);
                this.cxn = DriverManager.getConnection(this.url, this.username, this.password);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return this.cxn;
    }


    /**
     * Insert artikel into database
     *
     * @param a
     */
    public String insertArtikel(ArtikelFilm a) {
        return this.insertArtikel(a, null);
    }

    private String insertArtikel(ArtikelFilm a, Connection con) {
        String filmtitel = "";
        Connection wCon = null;
        try {
            if (con == null) {
                wCon = this.getConnection();
            } else {
                wCon = con;
            }

            wCon = this.getConnection();
            PreparedStatement statement = null;
            statement = wCon.prepareStatement("INSERT INTO ARTIKEL ("
                    + "vestigingID, "
                    + "artikelnummer, "
                    + "titel, "
                    + "afgeschreven, "
                    + "prijs, "
                    + "statuss, "
                    + "datadrager, "
                    + "genre, "
                    + "uitvoering, "
                    + "duur, "
                    + "producent, "
                    + "productiemaatschappij, "
                    + "filmcast, "
                    + "samenvatting, "
                    + "type) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
            statement.setInt(1, a.getVestigingID());
            statement.setInt(2, a.getArtikelNummer());
            statement.setString(3, a.getTitel());
            statement.setBoolean(4, a.isAfgeschreven());
            statement.setDouble(5, a.getPrijs());
            statement.setBoolean(6, true);

            String strDatadrager = a.getDatadrager().name();
            statement.setString(7, strDatadrager);

            String strGenre = a.getGenre().name();
            statement.setString(8, strGenre);

            String strUitvoering = a.getUitvoering().name();
            statement.setString(9, strUitvoering);

            statement.setInt(10, a.getDuur());
            statement.setString(11, a.getProducent());
            statement.setString(12, a.getProductiemaatschappij());
            statement.setString(13, a.getCast());
            statement.setString(14, a.getSamenvatting());
            statement.setString(15, "artikelfilmpie");
            statement.executeUpdate();
            filmtitel = a.getTitel();
        } catch (SQLException sqle) {
            Logger.getLogger(DatabaseController.class
                    .getName()).log(Level.SEVERE, null, sqle);
        } finally {
            if (con != null) {
                try {
                    wCon.close();
                } catch (SQLException ex) {
                    Logger.getLogger(DatabaseController.class
                            .getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return filmtitel;
    }
    
    /**
     * Zoek film op titel in centrale database
     * @param titel
     * @return 
     */
    public ArtikelFilm zoekenOpFilm(String titel) {
        return this.zoekenOpFilm(titel, null);
    }

    private ArtikelFilm zoekenOpFilm(String titel, Connection con) {
        ArtikelFilm artikelfilm = null;
        Connection wCon = null;
        try {
            if (con == null) {
                wCon = this.getConnection();
            } else {
                wCon = con;
            }
            PreparedStatement statement = wCon.prepareStatement(
                    "SELECT * FROM artikel WHERE "
                    + "titel = \"" + titel + "\"");
            ResultSet rs = statement.executeQuery();
            while (rs.next()) {
//                int dbVestigingID = rs.getInt("vestigingID");
                int dbArtikelnummer = rs.getInt("artikelnummer");
                String dbTitel = rs.getString("titel");
//                boolean dbAfgeschreven = rs.getBoolean("afgeschreven");
//                double dbPrijs = rs.getDouble("prijs");
//                boolean dbStatus = rs.getBoolean("status");
//
//                Datadrager dbDatadrager = null;
//                dbDatadrager = Datadrager.valueOf(rs.getString("DATADRAGER"));
//
                Genre dbGenre = null;
                dbGenre = Genre.valueOf(rs.getString("GENRE"));
//
//                Uitvoering dbUitvoering = null;
//                dbUitvoering = Uitvoering.valueOf(rs.getString("UITVOERING"));

                int dbDuur = rs.getInt("duur");
                String dbProducent = rs.getString("producent");
                String dbProductiemaatschappij = rs.getString("productiemaatschappij");
                String dbFilmcast = rs.getString("filmcast");
                String dbSamenvatting = rs.getString("samenvatting");

                artikelfilm = new ArtikelFilm(dbArtikelnummer,
                        dbTitel, dbGenre,
                        dbDuur, dbProducent, dbProductiemaatschappij, 
                        dbFilmcast, dbSamenvatting);
            }

        } catch (SQLException sqle) {
            Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, sqle);
        } finally {
            if (con != null) {
                try {
                    wCon.close();
                } catch (SQLException ex) {
                    Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return artikelfilm;
    }
    
    /**
     * Zoek op filmtitel in centrale database met een collectie van 
     * artikelfilms als resultaat.
     * @param titel
     * @return 
     */
    public List<ArtikelFilm> zoekenOpFilmTitel(String titel) {
        return this.zoekenOpFilmTitel(titel, null);
    }
    
    private List<ArtikelFilm> zoekenOpFilmTitel(String titel, Connection con) {
        List<ArtikelFilm> lijst = new ArrayList();
        ArtikelFilm artikelfilm = null; 
        Connection wCon = null;
        try {
            if (con == null) {
                wCon = this.getConnection();
            } else {
                wCon = con;
            }
            PreparedStatement statement = wCon.prepareStatement(
                    "SELECT * FROM artikel WHERE "
                    + "titel like \"%" + titel + "%\"");
            ResultSet rs = statement.executeQuery();
            while (rs.next()) {
//                int dbVestigingID = rs.getInt("vestigingID");
                int dbArtikelnummer = rs.getInt("artikelnummer");
                String dbTitel = rs.getString("titel");
//                boolean dbAfgeschreven = rs.getBoolean("afgeschreven");
//                double dbPrijs = rs.getDouble("prijs");
//                boolean dbStatus = rs.getBoolean("status");
//
//                Datadrager dbDatadrager = null;
//                dbDatadrager = Datadrager.valueOf(rs.getString("DATADRAGER"));
//
                Genre dbGenre = null;
                dbGenre = Genre.valueOf(rs.getString("GENRE"));
//
//                Uitvoering dbUitvoering = null;
//                dbUitvoering = Uitvoering.valueOf(rs.getString("UITVOERING"));

                int dbDuur = rs.getInt("duur");
                String dbProducent = rs.getString("producent");
                String dbProductiemaatschappij = rs.getString("productiemaatschappij");
                String dbFilmcast = rs.getString("filmcast");
                String dbSamenvatting = rs.getString("samenvatting");

                artikelfilm = new ArtikelFilm(dbArtikelnummer,
                        dbTitel, dbGenre,
                        dbDuur, dbProducent, dbProductiemaatschappij, 
                        dbFilmcast, dbSamenvatting);
                lijst.add(artikelfilm);
            }

        } catch (SQLException sqle) {
            Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, sqle);
        } finally {
            if (con != null) {
                try {
                    wCon.close();
                } catch (SQLException ex) {
                    Logger.getLogger(DatabaseController.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return lijst;
    }


}
